# -*- coding: utf-8 -*-

import numpy as np
import cv2
from config import project_path

"""
目标
　　• 学会读取视频文件，显示视频，保存视频文件
　　• 学会从摄像头获取并显示视频
　　• 你将会学习到这些函数：cv2.VideoCapture()，cv2.VideoWrite()
"""


def camera_capture_video():
    """
    摄像头捕获实时图像
        OpenCV 为这中应用提供了一个非常简单的接口。让我们使用摄像头来捕获一段视频，并把它转换成灰度视频显示出来。

        为了获取视频，需要创建一个 VideoCapture 对象。他的参数可以是设备的索引号，或者是一个视频文件。设备索引号就是在指定要使用的摄像头。
        一般的笔记本电脑都有内置摄像头。所以参数就是 0。可以通过设置成 1 或者其他的来选择别的摄像头。
        之后，你就可以一帧一帧的捕获视频了。但是最后，别忘了停止捕获视频。
    """

    cap = cv2.VideoCapture(0)

    while True:
        # 逐帧捕获
        ret, frame = cap.read()
        gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

        cv2.imshow('frame', gray)
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break

    # 释放捕获
    cap.release()
    cv2.destroyAllWindows()


def file_play_video():
    """
    文件播放视频
        与从摄像头中捕获一样，你只需要把设备索引号改成视频文件的名字。在播放每一帧时，使用 cv2.waiKey() 设置适当的持续时间。
        如果设置的太低视频就会播放的非常快，如果设置的太高就会播放的很慢（你可以使用这种方法控制视频的播放速度）。通常情况下 25 毫秒就可以了。
    """
    cap = cv2.VideoCapture(project_path + '/data/video/a1.mp4')

    while cap.isOpened():
        ret, frame = cap.read()
        gray = cv2.cvtColor(frame, cv2.COLOR_BGR2BGRA)

        cv2.imshow('frame', gray)
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break

    cap.release()
    cv2.destroyAllWindows()


def write_video():
    """
    保存视频
        创建一个 VideoWriter 的对象。
            指定输出文件的名字。
            指定 FourCC 编码。
            播放频率和帧的大小也都需要确定。
            最后一个是 isColor 标签。如果是 True，每一帧就是彩色图，否则就是灰度图。
        FourCC 就是一个 4 字节码，用来确定视频的编码格式。可用的编码列表可以从fourcc.org查到。这是平台依赖的。下面这些编码器对我来说是有用个。
            • In Fedora: DIVX, XVID, MJPG, X264, WMV1, WMV2
            • In Windows: DIVX

        FourCC 码以下面的格式传给程序，以 MJPG 为例：
            cv2.cv.FOURCC('M','J','P','G') 或者 cv2.cv.FOURCC(*'MJPG')。
    """
    cap = cv2.VideoCapture(0)

    fourcc = cv2.VideoWriter_fourcc(*'XVID')
    out = cv2.VideoWriter('output.avi', fourcc, 20.0, (640, 480))

    while cap.isOpened():
        ret, frame = cap.read()
        if ret:
            frame = cv2.flip(frame, 0)
            out.write(frame)
            cv2.imshow('frame', frame)
            if cv2.waitKey(1) & 0xFF == ord('q'):
                break
        else:
            break

    cap.release()
    out.release()
    cv2.destroyAllWindows()


if __name__ == '__main__':
    # camera_capture_video()
    file_play_video()
